#include <iostream>
#include <algorithm>
#include <queue> //目的是调用堆
using namespace std;

typedef struct SECTION
{
    int l;
    int r;
    //左端点和右端点
    bool operator<(struct SECTION other)
    {
        return l < other.l;
    }

    bool operator>(struct SECTION other)
    {
        return l > other.l;
    }
    //这里改成了左端点排序
} section;

const int N = 100010;

int n;
section a[N];                                        //存储区间
priority_queue<int, vector<int>, greater<int>> heap; //小根堆，用来找mr最小的组，默认的一般是大根堆

int main()
{
    cin >> n;
    for (int i = 0; i < n; ++i)
        cin >> a[i].l >> a[i].r;
    sort(a, a + n);
    for (int i = 0; i < n; ++i)                   //遍历所有区间
        if (heap.empty() || heap.top() >= a[i].l) //如果没有组或者mr最小的组都容不下
            heap.push(a[i].r);                    //就新建组
        else                                      //否则就加入mr最小的组
        {
            heap.pop();        //先把最小的弹出
            heap.push(a[i].r); //再加入新的，可以认为是修改堆顶
        }
    cout << heap.size();
    return 0;
}